import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';
import { message, Modal } from 'antd';

export const host = process.env.NODE_ENV === 'development' ? `${window.location.origin}/csc` : 'https://devin.cool/csc';

axios.defaults.baseURL = '/csc';

/**
 * axios 全局设置
 */
// 设置请求超时时间
axios.defaults.timeout = 10000;
// post 请求头
axios.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8';
// 请求拦截
axios.interceptors.request.use(
  config => {
    if (
      config.url !== '/captcha/createCaptcha' && // 排除登录相关接口
      config.url !== '/mLogin/verify'
    ) {
      const sessionKey = localStorage.getItem('sessionKey');
      if (config.url && config.url.indexOf('?') > -1) {
        config.url += `&sessionKey=${sessionKey}`;
      } else {
        config.url += `?sessionKey=${sessionKey}`;
      }
    }

    return config;
  },
  error => Promise.reject(error)
)
// 响应拦截
axios.interceptors.response.use(
  response => {
    if (response.config.responseType === 'arraybuffer') { // arraybuffer 不做处理
      return Promise.resolve(response);
    }
    if (response.data.retCode === '0') {
      return Promise.resolve(response);
    } else {
      if (response.data.retMsg) {
        message.error(response.data.retMsg);
      } else {
        message.error('未知错误，请重试');
      }
      return Promise.resolve(response);
    }
  },
  error => {
    if (error.response) {
      switch (error.response.status) {
        case 500:
        case 503:
          message.error('服务器异常，请稍后再试');
          break;
        case 400: message.error('bad Request'); break;
        case 401: message.error('鉴权信息异常'); break;
        case 404: message.error('未知的资源'); break;
        default: message.error(error.response.statusText); break;
      }
    } else if (error.request) {
      console.error(error.request);
    } else {
      console.error('Error', error.message);
    }
    Promise.reject(error.response.data)
  } // error 里我们可以进行 http 状态码校验，通过 error.response.status
)

/**
 * 请求 resolve 时的处理函数，根据配置调整返回的数据格式
 */
const resolveProcessor = (res: AxiosResponse<any>, config: any = {}): any => {
  if (config.needHeader) { // 需要 header
    return {
      header: res.headers,
      data: res.data
    }
  }
  if (res.data.retCode === '0') { // 默认 retCode 非 0 则不返回
    return res.data;
  } else {
    if (res.data.retCode === '2002') { // 登录状态过期，重新登录
      localStorage.removeItem('sessionKey');
      Modal.warning({
        title: '提示',
        content: '认证信息失效请重新登录',
        onOk() {
          window.location.href = '/login';
        }
      })
      return null;
    }
    if (config.needResponse) { // 需要返回值
      return res.data;
    } else {
      return null
    }
  }
}

/**
 * 封装常用 http 方法
 */
/**
 * 简单封装我们自己的 GET 请求方法
 * @param url 请求地址
 * @param param axios配置参数
 */
export const GET = (url: string, param?: AxiosRequestConfig, config?: any): Promise<any> => {
  return new Promise((resolve, reject) => {
    axios.get(url, param)
      .then(res => {
        resolve(resolveProcessor(res, config));
      }).catch(err => {
        reject(err);
      })
  })
}
/**
 * 简单封装 post 请求函数
 * @param url 请求地址
 * @param data 携带数据
 * @param param 请求配置
 */
export const POST = (url: string, data?: any, param?: AxiosRequestConfig, config?: any): Promise<any> => {
  return new Promise((resolve, reject) => {
    axios.post(url, data, param)
      .then(res => {
        resolve(resolveProcessor(res, config));
      }).catch(err => {
        reject(err);
      })
  })
}